package kr.co.bettersoft.waitnumberstoret.activity;


import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

import android.app.ListActivity;

import kr.co.bettersoft.waitnumberstoret.activity.PullToRefreshListView;
import kr.co.bettersoft.waitnumberstoret.activity.PullToRefreshListView.OnRefreshListener;
import kr.co.bettersoft.waitnumberstoret.adapter.StoreNoticeListAdapter;
import kr.co.bettersoft.waitnumberstoret.common.CommonConstant;
import kr.co.bettersoft.waitnumberstoret.common.WaitnumberStoreMRest;
import kr.co.bettersoft.waitnumberstoret.domain.EventNotice;
import kr.co.bettersoft.waitnumberstoret.domain.WaitingNumberStore;

/**
 * MainNoticeActivity
 * 
 * 메인 - 공지 액티비티
 * 
 * 공지 리스트를 확인할 수 있다.
 * 리스트에서 특정 공지를 선택하면 공지 상세 화면으로 이동한다. 
 *
 */
public class MainNoticeActivity extends ListActivity{
////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 변수 
	
	String TAG = "MainNoticeActivity";

	public final int GET_NOTICE_LIST = 401;				// 공지 목록을 가져온다.
	
	// 폰트
	private Typeface typefaceNanumGothic= null; 
	private Typeface typefaceNanumGothicBold = null;
	
	// 가맹점 아이디 	
	String merchantId = "";
	
	// 공용 프립스	
	SharedPreferences sharedPrefCustom;
	
	// 서버 통신
	int isRunning = 0;		// 통신 도중 중복 호출을 방지하기 위함.
//	WaitnumberStoreMRest waitnumberStoreMRest;
	String callResult = "";
//	String tempstr = "";
	JSONArray jsonArray;
	
	// 가맹점 공지사항 리스트
	public ArrayList<EventNotice> entries1 = new ArrayList<EventNotice>();
	List<EventNotice> entriesFn = new ArrayList<EventNotice>();				// 최종 꺼내어 화면에 보여줄 값
	public List<EventNotice> dbInEntries;	// db에 넣을 거
	public List<EventNotice> dbOutEntries;	// db에서 꺼낸거
	Boolean dbSaveEnable = true;		// db에 데이터 저장할지 여부
	
	
	// 화면 구성
	TextView titleBar; // 타이틀
	Button  noticeRegisterBtn;		// 공지 등록 버튼		
	View emptyView;		// 리스트 데이터 없을때 대체로 보여줄 뷰
//	ListView listView;	// 공지 리스트 보여줄 리스트뷰
	ProgressBar pb1;		// 중단 로딩 진행바
	
	// 상단 닫기 버튼
	Button topNaviCloseBtn; 
	
	// pull down refresh
	Boolean pullDownRefreshIng  = false;
	int listIdxForPullDownRefresh;
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
// 모바일 DB 관련
	
	/*
	 * 모바일 sqlite 를 사용하여 내 공지사항 목록을 받아와서 저장. 
	 * 이후 통신 불가일때 마지막으로 저장한 데이터를 보여준다.
	 * 저장할 값들.. 
	 * 
	 * 통신 실패시 알림창을 띄워준다.
	 * 통신 성공시 이전 db 테이블을 지우고 새로 테이블을 만들어서 데이터를 넣어준다.
	 * 
	 * 통신 성공 여부와 상관없이 db 테이블이 있고 데이터가 있으면 해당 데이터를 보여준다.
	 */
	
	////----------------------- SQLite  Query-----------------------//
	// 테이블 삭제 쿼리
	private static final String Q_INIT_TABLE = "DELETE FROM event_notice_info;" ;
	// 테이블 생성 쿼리.
	private static final String Q_CREATE_TABLE = "CREATE TABLE event_notice_info (" +
	"_id INTEGER PRIMARY KEY AUTOINCREMENT," +					// 모바일 db 저장되는 자동증가  인덱스 키
	"idWaitingEvents TEXT," +									// 인덱스 번호
	"merchantId TEXT," +											// 등록한 가맹점 아이디
	"companyName TEXT," +											// 등록한 가맹점 명
	"subject TEXT," +					// 제목	
	"content TEXT," +					// 본문
	"imageFileUrl TEXT," +										// 이미지 URL
	"registerDate TEXT" +										// 등록시각
	");" ;
	// 테이블 조회 쿼리
	private final String Q_GET_LIST = "SELECT * FROM event_notice_info";
	//----------------------- SQLite  Query-----------------------////

	
	//----------------------- SQLite -----------------------//

	// 초기화작업- db 및 테이블 검사하고 없으면 만들기.
	SQLiteDatabase db = null;
	/**
	 * initDB
	 *  db 를 초기화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void initDB(){
		Log.i(TAG,"initDB");
		// db 관련 작업 초기화, DB 열어 SQLiteDatabase 인스턴스 생성          db 열거나 없으면 생성
		if(db== null ){
			db= openOrCreateDatabase( "sqlite_waitNumberStoreDB.db", SQLiteDatabase.CREATE_IF_NECESSARY ,null );
		}
		// 테이블에서 데이터 가져오기 전 테이블 생성 확인 없으면 생성.
		checkTableIsCreated(db);
	}
	/**
	 * checkTableIsCreated
	 *  db 생성 확인하여 없으면 생성한다
	 *
	 * @param db
	 * @param
	 * @return
	 */
	public void checkTableIsCreated(SQLiteDatabase db){		// event_notice_info 라는 이름의 테이블을 검색하고 없으면 생성.
		Log.i(TAG, "checkTableIsCreated");
		try{
			Cursor c = db.query("sqlite_master" , new String[] {"count(*)"}, "name=?" , new String[] {"event_notice_info"}, null ,null , null);
			Integer cnt=0;
			c.moveToFirst();                                 // 커서를 첫라인으로 옮김
			while(c.isAfterLast()== false ){                   // 마지막 라인이 될때까지 1씩 증가하면서 본다
				cnt=c.getInt(0);
				c.moveToNext();
			}
			//커서는 사용 직후 닫는다
			c.close();
			//테이블 없으면 생성
			if(cnt==0){
				db.execSQL(Q_CREATE_TABLE);
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	// server에서 받은 data를 db로
	/**
	 * saveDataToDB
	 *  server에서 받은 data를 db로저장한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void saveDataToDB(){			//	db 테이블을 초기화 후 새 데이터를 넣습니다.	  
		Log.i(TAG, "saveDataToDB");
		try{
			if(db==null){
				db= openOrCreateDatabase( "sqlite_waitNumberStoreDB.db", SQLiteDatabase.CREATE_IF_NECESSARY ,null );
			}
			if(!(db.isOpen())){
				Log.i(TAG, "db is not open.. open db");
				db= openOrCreateDatabase( "sqlite_waitNumberStoreDB.db", SQLiteDatabase.CREATE_IF_NECESSARY ,null );
			}

			db.execSQL(Q_INIT_TABLE);
			ContentValues initialValues = null;
			int entrySize = dbInEntries.size();
			if(entrySize>0){
				for(int i =0; i<entrySize; i++){
					initialValues = new ContentValues(); 			
					
					initialValues.put("idWaitingEvents", dbInEntries.get(i).getIdWaitingEvents()); 
					initialValues.put("merchantId", dbInEntries.get(i).getMerchantId()); 
					initialValues.put("companyName", dbInEntries.get(i).getCompanyName()); 
					initialValues.put("subject", dbInEntries.get(i).getSubject()); 
					initialValues.put("content", dbInEntries.get(i).getContent()); 
					initialValues.put("imageFileUrl", dbInEntries.get(i).getImageFileUrl()); 
					initialValues.put("registerDate", dbInEntries.get(i).getRegisterDate()); 
					db.insert("event_notice_info", null, initialValues); 
				}
			}
			Log.i(TAG, "saveDataToDB success");

		}catch(Exception e){e.printStackTrace();}
	}

	// db 에 저장된 데이터를 화면에
	/**
	 * getDBData
	 *  db 에 저장된 데이터를 화면에보여주기 위해 꺼낸다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void getDBData(){
		Log.i(TAG, "getDBData");
		if(!db.isOpen()){
			Log.d(TAG,"getDBData-> db is closed. need to open");
			db= openOrCreateDatabase( "sqlite_waitNumberStoreDB.db", SQLiteDatabase.CREATE_IF_NECESSARY ,null );
		}

		String tmp_idWaitingEvents = "";	// 인덱스 번호?
		String tmp_merchantId = "";			// 등록한 가맹점 아이디
		String tmp_companyName = "";		// 등록한 가맹점 명
		String tmp_subject = "";			// 제목	
		String tmp_content = "";			// 본문
		String tmp_imageFileUrl = "";		// 이미지 URL
		String tmp_registerDate = "";		// 등록시각
		
		try{
			// 조회
			Cursor c = db.rawQuery( Q_GET_LIST, null );
			if(c.getCount()==0){
				Log.i(TAG, "saved notice data NotExist");
			}else{
				Log.i(TAG, "saved notice data Exist");				// 데이터 있으면 꺼내서 사용함.			// 데이터 꺼낼때
				dbOutEntries = new ArrayList<EventNotice>(c.getCount());		// 개수만큼 생성하기.
				c.moveToFirst();                                 // 커서를 첫라인으로 옮김
				while(c.isAfterLast()== false ){                   // 마지막 라인이 될때까지 1씩 증가하면서 본다
					tmp_idWaitingEvents = c.getString(1);	
					tmp_merchantId = c.getString(2);	
					tmp_companyName = c.getString(3);	
					tmp_subject = c.getString(4);	
					tmp_content = c.getString(5);	
					tmp_imageFileUrl = c.getString(6);	
					tmp_registerDate = c.getString(7);	
					
					dbOutEntries.add(new EventNotice(tmp_idWaitingEvents,
							tmp_merchantId,
							tmp_companyName,
							tmp_subject,
							tmp_content,
							tmp_imageFileUrl,
							tmp_registerDate
					));
					c.moveToNext();
				}
			}
			c.close();
			db.close();
			entriesFn = dbOutEntries;						//  꺼낸 데이터를 결과 데이터에 세팅 
		}catch(Exception e){e.printStackTrace();}
		showInfo();									//   결과 데이터를 화면에 보여준다.		 데이터 있는지 여부는 결과 처리에서 함께..
	}
	////---------------------SQLite ----------------------////
	
	
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
// 핸들러 설정
	
	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		
				if(b.getInt("showYN")==1){
					
					// 최종 결과 배열은 entriesFn 에 저장되어 있다.. 
					if(entriesFn!=null && entriesFn.size()>0){
						setListing();
						getListView().setVisibility(View.VISIBLE);
						emptyView.setVisibility(View.GONE);
					}else{
						Log.d(TAG,"no data");
						getListView().setEmptyView(emptyView);
						getListView().setVisibility(View.GONE);
						emptyView.setVisibility(View.VISIBLE);
					}
					isRunning = 0;
					hidePb();
				}
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.notice_progressbar);
					}
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.notice_progressbar);
					}
					pb1.setVisibility(View.INVISIBLE);
				}
				if(b.getInt("showErrToast")==1){
					Toast.makeText(MainNoticeActivity.this, getString(R.string.failed_to_open_page), Toast.LENGTH_SHORT).show();
					// 페이지를 불러오는데 실패했습니다.\n잠시후 다시 시도해주시기 바랍니다.	
				}
				
				switch (msg.what)
				{
					case GET_NOTICE_LIST : runOnUiThread(new RunnableGetNoticeList());
						break;
					default : 
						break;
				}

				
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};
	
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		Log.w(TAG,"onCreate");
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE );	// 타이틀바 제거
		setContentView(R.layout.main_notice_activity);
		
		WaitnumberStoreMRest waitnumberStoreMRest = new WaitnumberStoreMRest();
		
		titleBar = (TextView) findViewById(R.id.title_bar);
		
		topNaviCloseBtn = (Button) findViewById(R.id.top_navi_close_btn);
		// 상단 닫기 버튼
		topNaviCloseBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});
		
		noticeRegisterBtn  = (Button) findViewById(R.id.notice_register_btn);
		noticeRegisterBtn.setOnClickListener(new OnClickListener() {		// 글쓰기 화면으로 이동
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(MainNoticeActivity.this, MainNoticeWriteActivity.class);
				startActivity(intent);   
			}
		}); // ### 
		
		// 폰트 지정.
	    typefaceNanumGothic = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothic);  
	    typefaceNanumGothicBold = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothicBold);
	    titleBar.setTypeface(typefaceNanumGothic); // 폰트 적용
	    noticeRegisterBtn.setTypeface(typefaceNanumGothicBold);
		
//		listView  = (ListView)findViewById(R.id.listview);
		emptyView = findViewById(R.id.empty2);
		// DB 쓸거니까 초기화 해준다.
		initDB();
		
		// 가맹점 아이디를 꺼낸다.
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
		merchantId = sharedPrefCustom.getString("merchantId", "");
		
		
		////////////////////////////////  pull down list
		// Set a listener to be invoked when the list should be refreshed.
        ((PullToRefreshListView) getListView()).setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh() {
                // Do work to refresh the list here.
            	
	        	if(isRunning<1){								// 중복 실행 방지
	        		isRunning = 1;
	        		try {
	        			pullDownRefreshIng = true;				// 기본 로딩바는 보여주지 않기 위함
	        			new GetDataTask().execute();
	    			}catch (Exception e) {
	    				e.printStackTrace();
	    			} 
	    		}else{
	    			Log.w(TAG, "already running..");
	    			((PullToRefreshListView) getListView()).onRefreshComplete();
	    		}
            }
        });
     
	}
	
//////////////////////////////////////////////////////////////////////////////////////////////////////
	// pull down list
		
		private class GetDataTask extends AsyncTask<Void, Void, String[]> {

	        @Override
	        protected String[] doInBackground(Void... params) {
	        	/*
	        	 * 방법 1. 다른 애 시킨다. 평범한 중앙 로딩바로 변환되는 단점
	        	 */
//        		handler.sendEmptyMessage(GET_NOTICE_LIST);
	        	
	        	/*
	        	 * 방법 2. 직접 코드 가져와서 돌림. 자체 로딩바가 유지된다는 장점
	        	 */
	        	Log.d(TAG,"backgroundThreadGetNoticeList");
				
				// 파라미터 세팅
				WaitingNumberStore waitingNumberStore = new WaitingNumberStore();
				waitingNumberStore.setMerchantId(merchantId);
				
				// 서버 통신
//				if(!pullDownRefreshIng){	// 중앙로딩 -> 자체 로딩바를 보여줌
//					showPb();
//				}
				WaitnumberStoreMRest waitnumberStoreMRest = new WaitnumberStoreMRest();
				callResult = waitnumberStoreMRest.RestGetNoticeList(waitingNumberStore);
//				if(!pullDownRefreshIng){
//					hidePb();
//				}
				// 결과 처리
				if(!(callResult.equals("F"))){
//					tempstr = waitnumberStoreMRest.getTempstr();
					processNoticeData(callResult);
				}else{
					isRunning = 0;		
					getDBData();			// db에서 꺼내서 보여준다.
				}
	            return null;
	        }
	        @Override
	        protected void onPostExecute(String[] result) {
	            // Call onRefreshComplete when the list has been refreshed.
	        	pullDownRefreshIng = false;							// 기본 로딩바 보여주기 상태 초기화. resume 기능으로는 보여지도록.
	            ((PullToRefreshListView) getListView()).onRefreshComplete();		// 리프레시가 끝났음 
	            super.onPostExecute(result);
	        }
	    }
	
///////////////////////////////////// 	 /////////////////////////////////////
		
	//   로그 
	public void alertToUser(){				// 	data 조회가  안됐어요. 
		Log.d(TAG,"Get Data from Server -> Error Occured..");
	}
	
	/**
	 * setListing
	 *  리스트 보여주고 클릭 이벤트 등록 (공지사항 상세 보기)한다		// pull down refresh 버전으로 교체
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void setListing(){
		getListView().setAdapter(new StoreNoticeListAdapter(this, entriesFn));
		getListView().setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View v,
					int position, long id) {
				
				// 리스트 뷰 상단에 pull down refresh 영역 있는지 여부에 따라 결정.
				if(getListView().getCount()==entriesFn.size()){	// 상단에 아무것도 없으므로 그냥 사용
					listIdxForPullDownRefresh = position;
				}else{
					listIdxForPullDownRefresh = position-1;		// 상단에 pull down refresh 영역 한칸 차지하고 있으므로 한칸 빼줌.
				}
				Intent intent = new Intent(MainNoticeActivity.this, MainNoticeDetailActivity.class);
				intent.putExtra("idWaitingEvents", entriesFn.get(listIdxForPullDownRefresh).getIdWaitingEvents());		
				intent.putExtra("merchantId", entriesFn.get(listIdxForPullDownRefresh).getMerchantId());		
				intent.putExtra("companyName", entriesFn.get(listIdxForPullDownRefresh).getCompanyName());									
				intent.putExtra("subject", entriesFn.get(listIdxForPullDownRefresh).getSubject());									
				intent.putExtra("content", entriesFn.get(listIdxForPullDownRefresh).getContent());									
				intent.putExtra("imageFileUrl", entriesFn.get(listIdxForPullDownRefresh).getImageFileUrl());									
				intent.putExtra("registerDate", entriesFn.get(listIdxForPullDownRefresh).getRegisterDate());									
				startActivity(intent);
			}
		});
	}
	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	
	
	/**
	 * 러너블.  공지 목록을 가져온다.
	 */
	class RunnableGetNoticeList implements Runnable {
		public void run(){
			new backgroundThreadGetNoticeList().execute();
		}
	}
	/**
	 * backgroundThreadGetNoticeList
	 * 비동기    서버와 통신하여 공지 목록을 가져온다.
	 * @author blue
	 *
	 */
	public class backgroundThreadGetNoticeList extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadGetNoticeList");
			
			// 파라미터 세팅
			WaitingNumberStore waitingNumberStore = new WaitingNumberStore();
			waitingNumberStore.setMerchantId(merchantId);
			
			// 서버 통신
//			if(!pullDownRefreshIng){
				showPb();
//			}
			WaitnumberStoreMRest waitnumberStoreMRest = new WaitnumberStoreMRest();
			callResult = waitnumberStoreMRest.RestGetNoticeList(waitingNumberStore);
//			if(!pullDownRefreshIng){
//				hidePb();
//			}
			// 결과 처리
			if(!(callResult.equals("F"))){
//				tempstr = waitnumberStoreMRest.getTempstr();
				processNoticeData(callResult);
			}else{
				isRunning = 0;		
				getDBData();			// db에서 꺼내서 보여준다.
			}
			return null; 
		}
	}
	
	////////////////////////   하드웨어 메뉴 버튼.  ////////////////

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		String tmpstr = getString(R.string.refresh);		
		menu.add(Menu. NONE, Menu.FIRST+1, Menu.NONE, tmpstr );             // 신규등록 메뉴 추가. -- 새로고침
		return (super .onCreateOptionsMenu(menu));
	}
	// 옵션 메뉴 특정 아이템 클릭시 필요한 일 처리
	@Override
	public boolean onOptionsItemSelected(MenuItem item){
		return (itemCallback(item)|| super.onOptionsItemSelected(item));
	}
	// 아이템 아이디 값 기준 필요한 일 처리
	public boolean itemCallback(MenuItem item){
		switch(item.getItemId()){
		case Menu. FIRST+1:
			// 공지 목록 가져오기
			if(isRunning<1){
				isRunning = 1;
				handler.sendEmptyMessage(GET_NOTICE_LIST);
			}else{
				Log.w(TAG, "already running..");
			}
			return true ;
		}
		return false;
	}
///////////////////////////////////////////////////////////////////////////////////////////////////////

	// 받아온 공지 리스트 정보를 파싱하여 화면에 뿌린다.
	public void processNoticeData(String callResult){
		
		try {
			jsonArray = new JSONArray(callResult);
		} catch (JSONException e1) {
			e1.printStackTrace();
		}
		int max = jsonArray.length();
		try {
			entries1 = new ArrayList<EventNotice>(max);

			String tmp_idWaitingEvents = "";	// 인덱스 번호?
			String tmp_merchantId = "";			// 등록한 가맹점 아이디
			String tmp_companyName = "";		// 등록한 가맹점 명
			String tmp_subject = "";			// 제목	
			String tmp_content = "";			// 본문
			String tmp_imageFileUrl = "";		// 이미지 URL
			String tmp_registerDate = "";		// 등록시각
			if(max>0){
				for ( int i = 0; i < max; i++ ){
					JSONObject jsonObj = jsonArray.getJSONObject(i);

					int dayOfRegisterDate = 0;	// 오전 오후 분간용
					String dayOfRegisterDateStr = "";	// 다시 문자형 시간으로 변환해서 저장(2자리 유지하기 위함)
					String strAMPM = "";
					String tmp_registerDate2 = "";	// 형식 변환해서 저장용

					try{
						tmp_idWaitingEvents = jsonObj.getString("idWaitingEvents");
					}catch(Exception e){
						tmp_idWaitingEvents = "";
					}
					try{
						tmp_merchantId = jsonObj.getString("merchantId");
					}catch(Exception e){
						tmp_merchantId = "";
					}
					try{
						tmp_companyName = jsonObj.getString("companyName");
					}catch(Exception e){
						tmp_companyName = "";
					}
					try{
						tmp_subject = jsonObj.getString("subject");
					}catch(Exception e){
						tmp_subject = "";
					}
					try{
						tmp_content = jsonObj.getString("content");
					}catch(Exception e){
						tmp_content = "";
					}
					try{
						tmp_imageFileUrl = jsonObj.getString("imageFileUrl");
					}catch(Exception e){
						tmp_imageFileUrl = "";
					}
					try{
						tmp_registerDate = jsonObj.getString("registerDate");
						// 길면 자르기
						if(tmp_registerDate!=null &&(tmp_registerDate.length()>19)){
							tmp_registerDate = tmp_registerDate.substring(0, 19);		// 2013-05-15 15:21:25  -> 초까지 나옴
						}

						// 오전 오후 분간하기
						dayOfRegisterDate = Integer.parseInt(tmp_registerDate.substring(11, 13));	// dayOfRegisterDate
						if(dayOfRegisterDate>11){		// 12시 넘었을때 = 오후
							dayOfRegisterDate = dayOfRegisterDate - 12;
							strAMPM = getString(R.string.pm_of_day)+"";
						}else{				// 12시 이전 = 오전
							strAMPM = getString(R.string.am_of_day)+"";
						}

						// 두자리로 맞추기.
						dayOfRegisterDateStr = Integer.toString(dayOfRegisterDate);
						if(dayOfRegisterDate<10){		
							dayOfRegisterDateStr = "0"+dayOfRegisterDateStr;
						}

//						// 원하는 날짜 형식에 맞춰서 데이터 넣기
//						tmp_registerDate2 = tmp_registerDate.substring(0, 4)+getString(R.string.year) +tmp_registerDate.substring(5, 7) + getString(R.string.month) + tmp_registerDate.substring(8, 10) + getString(R.string.day) + " " + strAMPM + " " + dayOfRegisterDateStr + tmp_registerDate.substring(13);
//						tmp_registerDate = tmp_registerDate2;	
						
						// 원하는 날짜 형식에 맞춰서 데이터 넣기
						tmp_registerDate2 = 
							tmp_registerDate.substring(0, 4)+getString(R.string.year) 
							+tmp_registerDate.substring(5, 7) + getString(R.string.month) 
							+tmp_registerDate.substring(8, 10) + getString(R.string.day) 
							+ " " + strAMPM + " " 
							+dayOfRegisterDateStr + getString(R.string.hour) 
							+tmp_registerDate.substring(14, 16) + getString(R.string.minute) 
							+tmp_registerDate.substring(17, 19) + getString(R.string.seconds);
						tmp_registerDate = tmp_registerDate2;	
						
						
					}catch(Exception e){
						tmp_registerDate = "";
					}
					entries1.add(new EventNotice(tmp_idWaitingEvents,
							tmp_merchantId,
							tmp_companyName,
							tmp_subject,
							tmp_content,
							tmp_imageFileUrl,
							tmp_registerDate
					));
				}
			}
		}catch (JSONException e) {
			dbSaveEnable = false;
			e.printStackTrace();
		}
		dbInEntries = entries1; 
		// db 에 데이터를 넣는다.
		try{
			if(dbSaveEnable){		// 이미지까지 성공적으로 가져온 경우.
				saveDataToDB();
			}else{
				alertToUser();		// 데이터 조회 및 처리에 실패한 경우 DB에 있는 것 사용 
			}	 
		}catch(Exception e){
			e.printStackTrace();
		}
		dbSaveEnable = true;
		getDBData();			//db  쓰고 없으면 없다고 알림.   db에 있는 정보가 정확하다고 볼수는 없음.. 
	}
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////	
//	Util	
	
	/**
	 * showInfo
	 *  결과를 화면에 뿌려준다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showInfo(){
		
		//  가져온 데이터 화면에 보여주기.
		MainNoticeActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();
				Bundle b = new Bundle();
				b.putInt("showYN", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	
	/**
	 * onResume
	 * @param
	 * @param
	 * @return
	 */
	@Override
	public void onResume(){
		super.onResume();
		// 공지 목록 가져오기 -- 한번만 실행하도록 바꿈 - 다시 여러번 호출.
		if(isRunning<1){
			isRunning = 1;
			handler.sendEmptyMessage(GET_NOTICE_LIST);
		}else{
			Log.w(TAG, "already running..");
		}
	}

	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		MainNoticeActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 1);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		MainNoticeActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 2);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}
	/**
	 * showErrMsg
	 *  화면에 error 토스트 띄운다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showErrMsg(){			// 화면에 error 토스트 띄움 
		MainNoticeActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showErrToast", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 
}
